/**
 * 严格来说，never 类型不携带任何的类型信息
 * 只有 never 类型的变量能够赋值给另一个 never 类型变量
 * 在联合类型中会被直接移除
 * 
*/

//在联合类型中会被直接移除
let UnionWithNever : "hanxuming" | 599 | true | void | never;

/**
 * void 和 never：
 * 
 * void 作为类型表示一个空类型，就像没有返回值的函数使用 void 来作为返回值类型标注一样，
 * void 类型就像 JavaScript 中的 null 一样代表“这里有类型，但是个空类型”。
 * 
 * never 是一个“什么都没有”的类型，它甚至不包括空的类型
*/
//void 和 never 的类型兼容性
declare let v1: never;
declare let v2: void;
v1 = v2; // X 类型 void 不能赋值给类型 never
v2 = v1;


/**
 * never使用场景，比如一个只负责抛出错误的函数：
 * */
function justThrow(): never {
    throw new Error()
}

/**
 * 在类型流的分析中，一旦一个返回值类型为 never 的函数被调用，
 * 那么下方的代码都会被视为无效的代码（即无法执行到）
 * */
function justThrowA(): never {
    throw new Error()
}
function foo(input: number) {
    if (input > 1) {
        justThrowA();
        // 等同于 return 语句后的代码，即 Dead Code
        const name = "hanxuming";
    }
}

//export {}：解决“无法重新声明块范围变量”错误提示问题
export {}